import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';
import swaggerUi from 'swagger-ui-express';
// import swaggerDocument from '../swagger.yaml' with {type : 'yaml'};
import fs from 'fs';
import path from 'path';
import yaml from 'js-yaml';
import { fileURLToPath } from 'url';

import routes from './routes/index.js';

import minimist from 'minimist';

// 命令行参数
const ARGV = minimist(process.argv.slice(2));
console.log('命令行参数:', ARGV);

import sequelize from './config/db.js'; // 确保路径正确
import UserService from './services/user.js';

import {
    generateTestData,
    startMockDevicesForUser,
    startMockForAllDevices,
} from './devices/mockDev.js';

import { setDeviceTimer } from './services/device.js';

const intervalMap = {
    BPMonitor: 15, // 血压计：每15分钟采集一次
    spO2Monitor: 10, // 血氧仪：每10分钟采集一次
    BFPMonitor: 30, // 体脂秤：每30分钟采集一次
    Thermometer: 15, // 体温计：每15分钟采集一次
    BGMeter: 20, // 血糖仪：每20分钟采集一次
    wearable: 5, // 可穿戴设备：每5分钟采集一次（高频监测）
    ECGMonitor: 30, // 心电图仪：每30分钟采集一次
    SleepMonitor: 60, // 睡眠监测仪：每60分钟采集一次
    ActivityTracker: 10, // 活动追踪器：每10分钟采集一次
    default: 60, // 默认值：每60分钟采集一次
};

// 初始化数据库连接
async function bootstrap() {
    try {
        // 1️⃣ 测试连接
        console.log('⏳ 正在测试数据库连接...');
        await sequelize.authenticate();
        console.log('✅ 数据库连接成功');

        // 2️⃣ 同步所有模型到数据库
        await sequelize.sync({ force: false }); // force: true 会清空已有表
        console.log('✅ 数据库表已同步');

        // 3️⃣ 测试数据操作
        // await testdb();

        // 4️⃣ mock healthData test

        // await generateTestData({ userId: 1, deviceId: null, deviceType: null, count: 20 });

        if (ARGV?.mockDev) {
            // 支持多设备ID
            const userIds = Array.isArray(ARGV.mockDev) ? ARGV.mockDev : [ARGV.mockDev];
            console.log('👤 启动设备mock，用户ID:', userIds);
            for (const userId of userIds) {
                if (typeof userId === 'string' || typeof userId === 'number') {
                    const timeids = await startMockDevicesForUser(userId, 15);
                }
            }
        }

        // 5️⃣ 启动设备mock定时器，模拟设备数据采集
        const timerIds = await startMockForAllDevices(intervalMap, 15);
        setDeviceTimer(timerIds);
        console.log('✅ 设备数据采集定时器已启动');
    } catch (error) {
        console.error('❌ 操作失败:', error.message);
    }
}

const testdb = async () => {
    // // 3️⃣ 测试数据操作
    const user = await UserService.createUser({
        //注意手机号唯一
        phone: '13800010086',
        password: 'abc123',
        role: 'doctor',
        name: '张三',
        age: 35,
        sex: 'male',
    });
    console.log('✅ 测试数据操作成功:', user.toJSON());
};

bootstrap();

const app = express();
const PORT = process.env.PORT ?? 8000;

app.use(cors());
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

// 👇 加载 swagger.yaml

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const swaggerFilePath = path.resolve(__dirname, '../swagger.yaml');

const file = fs.readFileSync(swaggerFilePath, 'utf8');
const swaggerDocument = yaml.load(file);

app.use('/api/v1/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
app.use(`/api/v1`, routes);

const server = app.listen(PORT, () => {
    console.log(`Server is running on localhost:${PORT}`);
    console.log(`API docs: http://localhost:${PORT}/api/v1/docs`);
});

export default app;
// // 创建WebSocket服务器
// import { createServer } from 'http';
// import { app as expressApp } from './index.js';
// import socketIO from 'socket.io';

// const httpServer = createServer(expressApp);
// const io = socketIO(httpServer, {
//   cors: {
//     origin: '*', // 允许所有来源，实际生产环境应该设置具体的域名
//     methods: ['GET', 'POST']
//   }
// });

// // 存储客户端连接
// let clients = {};

// // WebSocket连接处理
// io.on('connection', (socket) => {
//   console.log('New client connected');

//   // 当客户端断开连接时的处理
//   socket.on('disconnect', () => {
//     console.log('Client disconnected');
//   });

//   // 处理客户端发送的消息
//   socket.on('client-message', (data) => {
//     console.log('Received message:', data);

//     // 将消息广播给所有客户端
//     io.emit('server-message', {
//       timestamp: new Date().toISOString(),
//       content: `Server received: ${data}`
//     });
//   });
// });

// // 启动HTTP服务器
// httpServer.listen(PORT, () => {
//   console.log(`Server is running on localhost:${PORT}`);
//   console.log(`API docs: http://localhost:${PORT}/api/v1/docs`);
// });

// export default app;
